//
//  ViewController.m
//  科技头条3
//
//  Created by zhusong on 2017/3/10.
//  Copyright © 2017年 Allen. All rights reserved.
//

#import "ViewController.h"
#import "NewsCell.h"
#import "NewsModel.h"
#import "YYModel.h"
#import "MJRefresh.h"

//定义cell重用标识符
static NSString *ID = @"newsCell" ;

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>

/**
 模型对象数组
 */
@property(nonatomic,strong) NSMutableArray *dataSourceArr ;

/**
 下拉刷新控件
 */
@property(nonatomic,strong) MJRefreshNormalHeader *refreshHeader ;

/**
 上拉刷新控件
 */
@property(nonatomic,strong) MJRefreshAutoFooter *refreshFooter ;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    //MARK: 初始化模型对象数组
    _dataSourceArr = [NSMutableArray array] ;
    
    //MARK: 关闭自动调整滚动内边距功能
    self.automaticallyAdjustsScrollViewInsets = NO ;
    
    //MARK: 注册cell: 从XIB加载
    [_tableView registerNib:[UINib nibWithNibName:@"NewsCell" bundle:nil] forCellReuseIdentifier:ID] ;
    
    //MARK: 设置_tableView自动行高
    _tableView.estimatedRowHeight = 200 ;
    _tableView.rowHeight = UITableViewAutomaticDimension ;
    
    //MARK: 初始化下拉刷新控件
    _refreshHeader = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadData)] ;
    
    //MARK: 初始化上拉刷新控件
    _refreshFooter = [MJRefreshAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadData)] ;
    
    //MARK: 将上下拉刷新控件赋值给UIScrollView的分类
    _tableView.mj_header = _refreshHeader ;
    _tableView.mj_footer = _refreshFooter ;
    
    //MARK: 加载网络数据
    [self loadData] ;
    
    
}

#pragma mark - 加载网络数据
-(void)loadData
{
   
    //MARK: 初始化标示上拉刷新和下拉刷新的变量: Type , Time
    NSInteger type = 0 ;
    NSString *time = @"0" ;
    
    //MARK: 程序刚启动时,根据上下拉刷新的控件状态 , 更改time值以及Type的值
    if (_refreshHeader.isRefreshing) {
        
        //程序刚启动时,没有刷新数据,时间置为0
        time = _dataSourceArr.count > 0 ? [_dataSourceArr.firstObject addtime].description : @"0" ;
        
    }
    
    if(_refreshFooter.isRefreshing){
        
        //程序刚启动时,没有刷新数据,时间置为0
        time = _dataSourceArr.count > 0 ? [_dataSourceArr.lastObject addtime].description : @"0" ;
        
        type = 1;
    }
    
    //MARK: 创建加载网络请求的网址,并设置好Type和time的值(随刷新而改变)
    //NSString-->NSURL-->NSURLRequest
    NSString *urlString = [NSString stringWithFormat:@"http://news.coolban.com/Api/Index/news_list/app/2/cat/0/limit/20/time/%@/type/%ld",time, type] ;
    
    NSURL *url = [NSURL URLWithString:urlString] ;
    
    NSURLRequest *request = [NSURLRequest requestWithURL:url] ;
    
    //MARK: 客户端向服务器发送网络请求,以及服务器向客户端返回数据,最后回调block
    
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //MARK: 处理网络请求错误
        if (error != nil) {
            NSLog(@"%@",error) ;
            return ;
        }
        
        //MARK: 解析JSON数据(使用NSJSONSerialization类)
        NSArray *newsJSONArr = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL] ;
        //MARK: 字典转模型(使用YYMOdel)
        NSArray *newsModelsArr = [NSArray yy_modelArrayWithClass:[NewsModel class] json:newsJSONArr] ;
        
        //使用可变数组包装模型对象数组,为后续数据刷新准备
        NSMutableArray *responseNewsArr = [NSMutableArray array] ;
        
        [responseNewsArr addObjectsFromArray:newsModelsArr] ;
        
        //MARK: 根据Type值,设置数据源数组--模型对象数组的数据
        if (type == 0) {
            
            //下拉刷新直接替换
            _dataSourceArr = responseNewsArr ;
            
        }else{
            
            //上拉刷新拼接数据
            [_dataSourceArr addObjectsFromArray:responseNewsArr] ;
        
        }
        
        //MARK: 切换到主线程,完成数据更新,即更新UI
        dispatch_async(dispatch_get_main_queue(), ^{
            
            //根据Type的值,判断上下拉刷新,停止缓冲图标
            if (type == 0) {
                
                [_refreshHeader endRefreshing] ;
                
            }else{
                
                [_refreshFooter endRefreshing] ;
            
            }
            
            //MARK: tableView更新数据
            [_tableView reloadData] ;
            
        }) ;
        

    }] resume] ;
    
}

#pragma mark - 实现UITableView的数据源代理方法

//MARK: 返回行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   //模型数组的元素个数即是行数
    return _dataSourceArr.count ;

}

//MARK: 返回自定义的cell
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //MARK: 1.创建自定义的cell
    NewsCell *cell = [_tableView dequeueReusableCellWithIdentifier:ID forIndexPath:indexPath] ;
    
    //MARK: 2.获取当前cell的数据模型对象
    NewsModel *model = _dataSourceArr[indexPath.row] ;
    
    //MARK: 3.设置cell的model属性为获取的模型数据对象
    cell.model = model ;
    
    //返回cell
    return cell ;

}


@end
